xref: /llvm-project/llvm/test/CodeGen/ARM/GlobalISel/thumb-select-globals-pic.mir (revision fae05692a36f9ebbd201d93c2a6b0f927564d7e6)
1# RUN: llc -O0 -mtriple thumb-linux -relocation-model=pic -mattr=+v6t2,+no-movt -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,ELF
2# RUN: llc -O0 -mtriple thumb-linux-linux -relocation-model=pic -mattr=+v6t2,-no-movt -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,ELF
3# RUN: llc -O0 -mtriple thumb-linux-darwin -relocation-model=pic -mattr=+v6t2,+no-movt -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,DARWIN-NOMOVT
4# RUN: llc -O0 -mtriple thumb-linux-darwin -relocation-model=pic -mattr=+v6t2,-no-movt -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s -check-prefixes=CHECK,DARWIN-MOVT
5--- |
6  @internal_global = internal global i32 42
7  define void @test_internal_global() { ret void }
8
9  @external_global = external global i32
10  define void @test_external_global() { ret void }
11
12  @internal_constant = internal constant i32 42
13  define void @test_internal_constant() { ret void }
14
15  @external_constant = external constant i32
16  define void @test_external_constant() { ret void }
17...
18---
19name:            test_internal_global
20# CHECK-LABEL: name: test_internal_global
21legalized:       true
22regBankSelected: true
23selected:        false
24# CHECK: selected: true
25registers:
26  - { id: 0, class: gprb }
27  - { id: 1, class: gprb }
28body:             |
29  bb.0:
30    %0(p0) = G_GLOBAL_VALUE @internal_global
31    ; DARWIN-MOVT: [[G:%[0-9]+]]:rgpr = t2MOV_ga_pcrel target-flags(arm-nonlazy) @internal_global
32    ; DARWIN-NOMOVT: [[G:%[0-9]+]]:tgpr = tLDRLIT_ga_pcrel target-flags(arm-nonlazy) @internal_global
33    ; ELF: [[G:%[0-9]+]]:tgpr = tLDRLIT_ga_pcrel @internal_global
34
35    %1(s32) = G_LOAD %0(p0) :: (load (s32) from @internal_global)
36    ; CHECK: [[V:%[0-9]+]]:gpr = t2LDRi12 [[G]], 0, 14 /* CC::al */, $noreg :: (load (s32) from @internal_global)
37
38    $r0 = COPY %1(s32)
39    ; CHECK: $r0 = COPY [[V]]
40
41    tBX_RET 14, $noreg, implicit $r0
42    ; CHECK: tBX_RET 14 /* CC::al */, $noreg, implicit $r0
43...
44---
45name:            test_external_global
46# CHECK-LABEL: name: test_external_global
47legalized:       true
48regBankSelected: true
49selected:        false
50# CHECK: selected: true
51registers:
52  - { id: 0, class: gprb }
53  - { id: 1, class: gprb }
54body:             |
55  bb.0:
56    %0(p0) = G_GLOBAL_VALUE @external_global
57    ; DARWIN-MOVT: [[G_GOT:%[0-9]+]]:rgpr = t2MOV_ga_pcrel target-flags(arm-nonlazy) @external_global
58    ; DARWIN-MOVT: [[G:%[0-9]+]]:gpr = t2LDRi12 [[G_GOT]], 0, 14 /* CC::al */, $noreg :: (load (s32) from got)
59    ; DARWIN-NOMOVT: [[G_GOT:%[0-9]+]]:tgpr = tLDRLIT_ga_pcrel target-flags(arm-nonlazy) @external_global
60    ; DARWIN-NOMOVT: [[G:%[0-9]+]]:gpr = t2LDRi12 [[G_GOT]], 0, 14 /* CC::al */, $noreg :: (load (s32) from got)
61    ; ELF: [[G_GOT:%[0-9]+]]:tgpr = tLDRLIT_ga_pcrel target-flags(arm-got) @external_global
62    ; ELF: [[G:%[0-9]+]]:gpr = t2LDRi12 [[G_GOT]], 0, 14 /* CC::al */, $noreg :: (load (s32) from got)
63
64    %1(s32) = G_LOAD %0(p0) :: (load (s32) from @external_global)
65    ; CHECK: [[V:%[0-9]+]]:gpr = t2LDRi12 [[G]], 0, 14 /* CC::al */, $noreg :: (load (s32) from @external_global)
66
67    $r0 = COPY %1(s32)
68    ; CHECK: $r0 = COPY [[V]]
69
70    tBX_RET 14, $noreg, implicit $r0
71    ; CHECK: tBX_RET 14 /* CC::al */, $noreg, implicit $r0
72...
73---
74name:            test_internal_constant
75# CHECK-LABEL: name: test_internal_constant
76legalized:       true
77regBankSelected: true
78selected:        false
79# CHECK: selected: true
80registers:
81  - { id: 0, class: gprb }
82  - { id: 1, class: gprb }
83body:             |
84  bb.0:
85    %0(p0) = G_GLOBAL_VALUE @internal_constant
86    ; DARWIN-MOVT: [[G:%[0-9]+]]:rgpr = t2MOV_ga_pcrel target-flags(arm-nonlazy) @internal_constant
87    ; DARWIN-NOMOVT: [[G:%[0-9]+]]:tgpr = tLDRLIT_ga_pcrel target-flags(arm-nonlazy) @internal_constant
88    ; ELF: [[G:%[0-9]+]]:tgpr = tLDRLIT_ga_pcrel @internal_constant
89
90    %1(s32) = G_LOAD %0(p0) :: (load (s32) from @internal_constant)
91    ; CHECK: [[V:%[0-9]+]]:gpr = t2LDRi12 [[G]], 0, 14 /* CC::al */, $noreg :: (load (s32) from @internal_constant)
92
93    $r0 = COPY %1(s32)
94    ; CHECK: $r0 = COPY [[V]]
95
96    tBX_RET 14, $noreg, implicit $r0
97    ; CHECK: tBX_RET 14 /* CC::al */, $noreg, implicit $r0
98...
99---
100name:            test_external_constant
101# CHECK-LABEL: name: test_external_constant
102legalized:       true
103regBankSelected: true
104selected:        false
105# CHECK: selected: true
106registers:
107  - { id: 0, class: gprb }
108  - { id: 1, class: gprb }
109body:             |
110  bb.0:
111    %0(p0) = G_GLOBAL_VALUE @external_constant
112    ; DARWIN-MOVT: [[G_GOT:%[0-9]+]]:rgpr = t2MOV_ga_pcrel target-flags(arm-nonlazy) @external_constant
113    ; DARWIN-MOVT: [[G:%[0-9]+]]:gpr = t2LDRi12 [[G_GOT]], 0, 14 /* CC::al */, $noreg :: (load (s32) from got)
114    ; DARWIN-NOMOVT: [[G_GOT:%[0-9]+]]:tgpr = tLDRLIT_ga_pcrel target-flags(arm-nonlazy) @external_constant
115    ; DARWIN-NOMOVT: [[G:%[0-9]+]]:gpr = t2LDRi12 [[G_GOT]], 0, 14 /* CC::al */, $noreg :: (load (s32) from got)
116    ; ELF: [[G_GOT:%[0-9]+]]:tgpr = tLDRLIT_ga_pcrel target-flags(arm-got) @external_constant
117    ; ELF: [[G:%[0-9]+]]:gpr = t2LDRi12 [[G_GOT]], 0, 14 /* CC::al */, $noreg :: (load (s32) from got)
118
119    %1(s32) = G_LOAD %0(p0) :: (load (s32) from @external_constant)
120    ; CHECK: [[V:%[0-9]+]]:gpr = t2LDRi12 [[G]], 0, 14 /* CC::al */, $noreg :: (load (s32) from @external_constant)
121
122    $r0 = COPY %1(s32)
123    ; CHECK: $r0 = COPY [[V]]
124
125    tBX_RET 14, $noreg, implicit $r0
126    ; CHECK: tBX_RET 14 /* CC::al */, $noreg, implicit $r0
127...
128