1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple aarch64-unknown-unknown -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=DEFAULT,CHECK 3# RUN: llc -mtriple aarch64-apple-darwin -code-model=large -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=LARGE-MACHO,CHECK 4# RUN: llc -mtriple aarch64-apple-darwin -code-model=small -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=SMALL-MACHO,CHECK 5# RUN: llc -mtriple aarch64-linux-elf -code-model=large -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=LARGE-ELF,CHECK 6# RUN: llc -mtriple aarch64-linux-elf -code-model=tiny -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=TINY,CHECK 7# RUN: llc -mtriple aarch64-windows-coff -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=WINDOWS,CHECK 8 9# Each of these tests has a trivial pattern for folding a G_PTR_ADD into a 10# G_GLOBAL_VALUE. 11# 12# Check that given different code models/target features, we do/don't fold. 13 14--- | 15 @external_linkage = external hidden global i32 16 @common_linkage = common local_unnamed_addr global i32 0, align 4 17 @internal_linkage = internal unnamed_addr global i32 0, align 4 18 @extern_weak_linkage = extern_weak hidden global i32 19 @dll_import = external dllimport global i32 20 21 define void @test_external_linkage() { ret void } 22 define void @test_internal_linkage() { ret void } 23 define void @test_common_linkage() { ret void } 24 define void @test_extern_weak_linkage() { ret void } 25 define void @never_fold_tagged_globals() #0 { ret void } 26 define void @test_dll_import() { ret void } 27 28 attributes #0 = { "target-features"="+tagged-globals" } 29... 30--- 31name: test_external_linkage 32alignment: 4 33tracksRegLiveness: true 34machineFunctionInfo: {} 35body: | 36 bb.0: 37 ; Large + Mach-O goes via GOT, so we can't fold. 38 39 ; DEFAULT-LABEL: name: test_external_linkage 40 ; DEFAULT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 41 ; DEFAULT: $x0 = COPY [[GV]](p0) 42 ; DEFAULT: RET_ReallyLR implicit $x0 43 ; LARGE-MACHO-LABEL: name: test_external_linkage 44 ; LARGE-MACHO: %global:_(p0) = G_GLOBAL_VALUE @external_linkage 45 ; LARGE-MACHO: %imm:_(s64) = G_CONSTANT i64 1 46 ; LARGE-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 47 ; LARGE-MACHO: $x0 = COPY %ptr_add(p0) 48 ; LARGE-MACHO: RET_ReallyLR implicit $x0 49 ; SMALL-MACHO-LABEL: name: test_external_linkage 50 ; SMALL-MACHO: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 51 ; SMALL-MACHO: $x0 = COPY [[GV]](p0) 52 ; SMALL-MACHO: RET_ReallyLR implicit $x0 53 ; LARGE-ELF-LABEL: name: test_external_linkage 54 ; LARGE-ELF: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 55 ; LARGE-ELF: $x0 = COPY [[GV]](p0) 56 ; LARGE-ELF: RET_ReallyLR implicit $x0 57 ; TINY-LABEL: name: test_external_linkage 58 ; TINY: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 59 ; TINY: $x0 = COPY [[GV]](p0) 60 ; TINY: RET_ReallyLR implicit $x0 61 ; WINDOWS-LABEL: name: test_external_linkage 62 ; WINDOWS: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 63 ; WINDOWS: $x0 = COPY [[GV]](p0) 64 ; WINDOWS: RET_ReallyLR implicit $x0 65 %global:_(p0) = G_GLOBAL_VALUE @external_linkage 66 %imm:_(s64) = G_CONSTANT i64 1 67 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 68 $x0 = COPY %ptr_add(p0) 69 RET_ReallyLR implicit $x0 70 71... 72--- 73name: test_internal_linkage 74alignment: 4 75tracksRegLiveness: true 76machineFunctionInfo: {} 77body: | 78 bb.0: 79 ; Large + Mach-O goes via GOT, so we can't fold. 80 81 ; DEFAULT-LABEL: name: test_internal_linkage 82 ; DEFAULT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @internal_linkage + 1 83 ; DEFAULT: $x0 = COPY [[GV]](p0) 84 ; DEFAULT: RET_ReallyLR implicit $x0 85 ; LARGE-MACHO-LABEL: name: test_internal_linkage 86 ; LARGE-MACHO: %global:_(p0) = G_GLOBAL_VALUE @internal_linkage 87 ; LARGE-MACHO: %imm:_(s64) = G_CONSTANT i64 1 88 ; LARGE-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 89 ; LARGE-MACHO: $x0 = COPY %ptr_add(p0) 90 ; LARGE-MACHO: RET_ReallyLR implicit $x0 91 ; SMALL-MACHO-LABEL: name: test_internal_linkage 92 ; SMALL-MACHO: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @internal_linkage + 1 93 ; SMALL-MACHO: $x0 = COPY [[GV]](p0) 94 ; SMALL-MACHO: RET_ReallyLR implicit $x0 95 ; LARGE-ELF-LABEL: name: test_internal_linkage 96 ; LARGE-ELF: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @internal_linkage + 1 97 ; LARGE-ELF: $x0 = COPY [[GV]](p0) 98 ; LARGE-ELF: RET_ReallyLR implicit $x0 99 ; TINY-LABEL: name: test_internal_linkage 100 ; TINY: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @internal_linkage + 1 101 ; TINY: $x0 = COPY [[GV]](p0) 102 ; TINY: RET_ReallyLR implicit $x0 103 ; WINDOWS-LABEL: name: test_internal_linkage 104 ; WINDOWS: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @internal_linkage + 1 105 ; WINDOWS: $x0 = COPY [[GV]](p0) 106 ; WINDOWS: RET_ReallyLR implicit $x0 107 %global:_(p0) = G_GLOBAL_VALUE @internal_linkage 108 %imm:_(s64) = G_CONSTANT i64 1 109 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 110 $x0 = COPY %ptr_add(p0) 111 RET_ReallyLR implicit $x0 112 113... 114--- 115name: test_common_linkage 116alignment: 4 117tracksRegLiveness: true 118machineFunctionInfo: {} 119body: | 120 bb.0: 121 ; DEFAULT-LABEL: name: test_common_linkage 122 ; DEFAULT: %global:_(p0) = G_GLOBAL_VALUE @common_linkage 123 ; DEFAULT: %imm:_(s64) = G_CONSTANT i64 1 124 ; DEFAULT: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 125 ; DEFAULT: $x0 = COPY %ptr_add(p0) 126 ; DEFAULT: RET_ReallyLR implicit $x0 127 ; LARGE-MACHO-LABEL: name: test_common_linkage 128 ; LARGE-MACHO: %global:_(p0) = G_GLOBAL_VALUE @common_linkage 129 ; LARGE-MACHO: %imm:_(s64) = G_CONSTANT i64 1 130 ; LARGE-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 131 ; LARGE-MACHO: $x0 = COPY %ptr_add(p0) 132 ; LARGE-MACHO: RET_ReallyLR implicit $x0 133 ; SMALL-MACHO-LABEL: name: test_common_linkage 134 ; SMALL-MACHO: %global:_(p0) = G_GLOBAL_VALUE @common_linkage 135 ; SMALL-MACHO: %imm:_(s64) = G_CONSTANT i64 1 136 ; SMALL-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 137 ; SMALL-MACHO: $x0 = COPY %ptr_add(p0) 138 ; SMALL-MACHO: RET_ReallyLR implicit $x0 139 ; LARGE-ELF-LABEL: name: test_common_linkage 140 ; LARGE-ELF: %global:_(p0) = G_GLOBAL_VALUE @common_linkage 141 ; LARGE-ELF: %imm:_(s64) = G_CONSTANT i64 1 142 ; LARGE-ELF: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 143 ; LARGE-ELF: $x0 = COPY %ptr_add(p0) 144 ; LARGE-ELF: RET_ReallyLR implicit $x0 145 ; TINY-LABEL: name: test_common_linkage 146 ; TINY: %global:_(p0) = G_GLOBAL_VALUE @common_linkage 147 ; TINY: %imm:_(s64) = G_CONSTANT i64 1 148 ; TINY: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 149 ; TINY: $x0 = COPY %ptr_add(p0) 150 ; TINY: RET_ReallyLR implicit $x0 151 ; WINDOWS-LABEL: name: test_common_linkage 152 ; WINDOWS: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @common_linkage + 1 153 ; WINDOWS: $x0 = COPY [[GV]](p0) 154 ; WINDOWS: RET_ReallyLR implicit $x0 155 %global:_(p0) = G_GLOBAL_VALUE @common_linkage 156 %imm:_(s64) = G_CONSTANT i64 1 157 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 158 $x0 = COPY %ptr_add(p0) 159 RET_ReallyLR implicit $x0 160 161... 162--- 163name: test_extern_weak_linkage 164alignment: 4 165tracksRegLiveness: true 166machineFunctionInfo: {} 167body: | 168 bb.0: 169 ; DEFAULT-LABEL: name: test_extern_weak_linkage 170 ; DEFAULT: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage 171 ; DEFAULT: %imm:_(s64) = G_CONSTANT i64 1 172 ; DEFAULT: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 173 ; DEFAULT: $x0 = COPY %ptr_add(p0) 174 ; DEFAULT: RET_ReallyLR implicit $x0 175 ; LARGE-MACHO-LABEL: name: test_extern_weak_linkage 176 ; LARGE-MACHO: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage 177 ; LARGE-MACHO: %imm:_(s64) = G_CONSTANT i64 1 178 ; LARGE-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 179 ; LARGE-MACHO: $x0 = COPY %ptr_add(p0) 180 ; LARGE-MACHO: RET_ReallyLR implicit $x0 181 ; SMALL-MACHO-LABEL: name: test_extern_weak_linkage 182 ; SMALL-MACHO: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage 183 ; SMALL-MACHO: %imm:_(s64) = G_CONSTANT i64 1 184 ; SMALL-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 185 ; SMALL-MACHO: $x0 = COPY %ptr_add(p0) 186 ; SMALL-MACHO: RET_ReallyLR implicit $x0 187 ; LARGE-ELF-LABEL: name: test_extern_weak_linkage 188 ; LARGE-ELF: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage 189 ; LARGE-ELF: %imm:_(s64) = G_CONSTANT i64 1 190 ; LARGE-ELF: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 191 ; LARGE-ELF: $x0 = COPY %ptr_add(p0) 192 ; LARGE-ELF: RET_ReallyLR implicit $x0 193 ; TINY-LABEL: name: test_extern_weak_linkage 194 ; TINY: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage 195 ; TINY: %imm:_(s64) = G_CONSTANT i64 1 196 ; TINY: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 197 ; TINY: $x0 = COPY %ptr_add(p0) 198 ; TINY: RET_ReallyLR implicit $x0 199 ; WINDOWS-LABEL: name: test_extern_weak_linkage 200 ; WINDOWS: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage 201 ; WINDOWS: %imm:_(s64) = G_CONSTANT i64 1 202 ; WINDOWS: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 203 ; WINDOWS: $x0 = COPY %ptr_add(p0) 204 ; WINDOWS: RET_ReallyLR implicit $x0 205 %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage 206 %imm:_(s64) = G_CONSTANT i64 1 207 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 208 $x0 = COPY %ptr_add(p0) 209 RET_ReallyLR implicit $x0 210 211... 212--- 213name: never_fold_tagged_globals 214alignment: 4 215tracksRegLiveness: true 216machineFunctionInfo: {} 217body: | 218 bb.0: 219 ; CHECK-LABEL: name: never_fold_tagged_globals 220 ; CHECK-NOT: %global:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 221 %global:_(p0) = G_GLOBAL_VALUE @external_linkage 222 %imm:_(s64) = G_CONSTANT i64 1 223 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 224 $x0 = COPY %ptr_add(p0) 225 RET_ReallyLR implicit $x0 226 227... 228--- 229name: test_dll_import 230alignment: 4 231tracksRegLiveness: true 232machineFunctionInfo: {} 233body: | 234 bb.0: 235 ; CHECK-LABEL: name: test_dll_import 236 ; CHECK-NOT: %global:_(p0) = G_GLOBAL_VALUE @dll_import + 1 237 %global:_(p0) = G_GLOBAL_VALUE @dll_import 238 %imm:_(s64) = G_CONSTANT i64 1 239 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) 240 $x0 = COPY %ptr_add(p0) 241 RET_ReallyLR implicit $x0 242