# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple aarch64-unknown-unknown -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=DEFAULT,CHECK # 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 # 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 # 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 # RUN: llc -mtriple aarch64-linux-elf -code-model=tiny -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=TINY,CHECK # RUN: llc -mtriple aarch64-windows-coff -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=WINDOWS,CHECK # Each of these tests has a trivial pattern for folding a G_PTR_ADD into a # G_GLOBAL_VALUE. # # Check that given different code models/target features, we do/don't fold. --- | @external_linkage = external hidden global i32 @common_linkage = common local_unnamed_addr global i32 0, align 4 @internal_linkage = internal unnamed_addr global i32 0, align 4 @extern_weak_linkage = extern_weak hidden global i32 @dll_import = external dllimport global i32 define void @test_external_linkage() { ret void } define void @test_internal_linkage() { ret void } define void @test_common_linkage() { ret void } define void @test_extern_weak_linkage() { ret void } define void @never_fold_tagged_globals() #0 { ret void } define void @test_dll_import() { ret void } attributes #0 = { "target-features"="+tagged-globals" } ... --- name: test_external_linkage alignment: 4 tracksRegLiveness: true machineFunctionInfo: {} body: | bb.0: ; Large + Mach-O goes via GOT, so we can't fold. ; DEFAULT-LABEL: name: test_external_linkage ; DEFAULT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 ; DEFAULT: $x0 = COPY [[GV]](p0) ; DEFAULT: RET_ReallyLR implicit $x0 ; LARGE-MACHO-LABEL: name: test_external_linkage ; LARGE-MACHO: %global:_(p0) = G_GLOBAL_VALUE @external_linkage ; LARGE-MACHO: %imm:_(s64) = G_CONSTANT i64 1 ; LARGE-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; LARGE-MACHO: $x0 = COPY %ptr_add(p0) ; LARGE-MACHO: RET_ReallyLR implicit $x0 ; SMALL-MACHO-LABEL: name: test_external_linkage ; SMALL-MACHO: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 ; SMALL-MACHO: $x0 = COPY [[GV]](p0) ; SMALL-MACHO: RET_ReallyLR implicit $x0 ; LARGE-ELF-LABEL: name: test_external_linkage ; LARGE-ELF: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 ; LARGE-ELF: $x0 = COPY [[GV]](p0) ; LARGE-ELF: RET_ReallyLR implicit $x0 ; TINY-LABEL: name: test_external_linkage ; TINY: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 ; TINY: $x0 = COPY [[GV]](p0) ; TINY: RET_ReallyLR implicit $x0 ; WINDOWS-LABEL: name: test_external_linkage ; WINDOWS: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 ; WINDOWS: $x0 = COPY [[GV]](p0) ; WINDOWS: RET_ReallyLR implicit $x0 %global:_(p0) = G_GLOBAL_VALUE @external_linkage %imm:_(s64) = G_CONSTANT i64 1 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) $x0 = COPY %ptr_add(p0) RET_ReallyLR implicit $x0 ... --- name: test_internal_linkage alignment: 4 tracksRegLiveness: true machineFunctionInfo: {} body: | bb.0: ; Large + Mach-O goes via GOT, so we can't fold. ; DEFAULT-LABEL: name: test_internal_linkage ; DEFAULT: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @internal_linkage + 1 ; DEFAULT: $x0 = COPY [[GV]](p0) ; DEFAULT: RET_ReallyLR implicit $x0 ; LARGE-MACHO-LABEL: name: test_internal_linkage ; LARGE-MACHO: %global:_(p0) = G_GLOBAL_VALUE @internal_linkage ; LARGE-MACHO: %imm:_(s64) = G_CONSTANT i64 1 ; LARGE-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; LARGE-MACHO: $x0 = COPY %ptr_add(p0) ; LARGE-MACHO: RET_ReallyLR implicit $x0 ; SMALL-MACHO-LABEL: name: test_internal_linkage ; SMALL-MACHO: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @internal_linkage + 1 ; SMALL-MACHO: $x0 = COPY [[GV]](p0) ; SMALL-MACHO: RET_ReallyLR implicit $x0 ; LARGE-ELF-LABEL: name: test_internal_linkage ; LARGE-ELF: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @internal_linkage + 1 ; LARGE-ELF: $x0 = COPY [[GV]](p0) ; LARGE-ELF: RET_ReallyLR implicit $x0 ; TINY-LABEL: name: test_internal_linkage ; TINY: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @internal_linkage + 1 ; TINY: $x0 = COPY [[GV]](p0) ; TINY: RET_ReallyLR implicit $x0 ; WINDOWS-LABEL: name: test_internal_linkage ; WINDOWS: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @internal_linkage + 1 ; WINDOWS: $x0 = COPY [[GV]](p0) ; WINDOWS: RET_ReallyLR implicit $x0 %global:_(p0) = G_GLOBAL_VALUE @internal_linkage %imm:_(s64) = G_CONSTANT i64 1 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) $x0 = COPY %ptr_add(p0) RET_ReallyLR implicit $x0 ... --- name: test_common_linkage alignment: 4 tracksRegLiveness: true machineFunctionInfo: {} body: | bb.0: ; DEFAULT-LABEL: name: test_common_linkage ; DEFAULT: %global:_(p0) = G_GLOBAL_VALUE @common_linkage ; DEFAULT: %imm:_(s64) = G_CONSTANT i64 1 ; DEFAULT: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; DEFAULT: $x0 = COPY %ptr_add(p0) ; DEFAULT: RET_ReallyLR implicit $x0 ; LARGE-MACHO-LABEL: name: test_common_linkage ; LARGE-MACHO: %global:_(p0) = G_GLOBAL_VALUE @common_linkage ; LARGE-MACHO: %imm:_(s64) = G_CONSTANT i64 1 ; LARGE-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; LARGE-MACHO: $x0 = COPY %ptr_add(p0) ; LARGE-MACHO: RET_ReallyLR implicit $x0 ; SMALL-MACHO-LABEL: name: test_common_linkage ; SMALL-MACHO: %global:_(p0) = G_GLOBAL_VALUE @common_linkage ; SMALL-MACHO: %imm:_(s64) = G_CONSTANT i64 1 ; SMALL-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; SMALL-MACHO: $x0 = COPY %ptr_add(p0) ; SMALL-MACHO: RET_ReallyLR implicit $x0 ; LARGE-ELF-LABEL: name: test_common_linkage ; LARGE-ELF: %global:_(p0) = G_GLOBAL_VALUE @common_linkage ; LARGE-ELF: %imm:_(s64) = G_CONSTANT i64 1 ; LARGE-ELF: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; LARGE-ELF: $x0 = COPY %ptr_add(p0) ; LARGE-ELF: RET_ReallyLR implicit $x0 ; TINY-LABEL: name: test_common_linkage ; TINY: %global:_(p0) = G_GLOBAL_VALUE @common_linkage ; TINY: %imm:_(s64) = G_CONSTANT i64 1 ; TINY: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; TINY: $x0 = COPY %ptr_add(p0) ; TINY: RET_ReallyLR implicit $x0 ; WINDOWS-LABEL: name: test_common_linkage ; WINDOWS: [[GV:%[0-9]+]]:_(p0) = G_GLOBAL_VALUE @common_linkage + 1 ; WINDOWS: $x0 = COPY [[GV]](p0) ; WINDOWS: RET_ReallyLR implicit $x0 %global:_(p0) = G_GLOBAL_VALUE @common_linkage %imm:_(s64) = G_CONSTANT i64 1 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) $x0 = COPY %ptr_add(p0) RET_ReallyLR implicit $x0 ... --- name: test_extern_weak_linkage alignment: 4 tracksRegLiveness: true machineFunctionInfo: {} body: | bb.0: ; DEFAULT-LABEL: name: test_extern_weak_linkage ; DEFAULT: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage ; DEFAULT: %imm:_(s64) = G_CONSTANT i64 1 ; DEFAULT: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; DEFAULT: $x0 = COPY %ptr_add(p0) ; DEFAULT: RET_ReallyLR implicit $x0 ; LARGE-MACHO-LABEL: name: test_extern_weak_linkage ; LARGE-MACHO: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage ; LARGE-MACHO: %imm:_(s64) = G_CONSTANT i64 1 ; LARGE-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; LARGE-MACHO: $x0 = COPY %ptr_add(p0) ; LARGE-MACHO: RET_ReallyLR implicit $x0 ; SMALL-MACHO-LABEL: name: test_extern_weak_linkage ; SMALL-MACHO: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage ; SMALL-MACHO: %imm:_(s64) = G_CONSTANT i64 1 ; SMALL-MACHO: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; SMALL-MACHO: $x0 = COPY %ptr_add(p0) ; SMALL-MACHO: RET_ReallyLR implicit $x0 ; LARGE-ELF-LABEL: name: test_extern_weak_linkage ; LARGE-ELF: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage ; LARGE-ELF: %imm:_(s64) = G_CONSTANT i64 1 ; LARGE-ELF: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; LARGE-ELF: $x0 = COPY %ptr_add(p0) ; LARGE-ELF: RET_ReallyLR implicit $x0 ; TINY-LABEL: name: test_extern_weak_linkage ; TINY: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage ; TINY: %imm:_(s64) = G_CONSTANT i64 1 ; TINY: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; TINY: $x0 = COPY %ptr_add(p0) ; TINY: RET_ReallyLR implicit $x0 ; WINDOWS-LABEL: name: test_extern_weak_linkage ; WINDOWS: %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage ; WINDOWS: %imm:_(s64) = G_CONSTANT i64 1 ; WINDOWS: %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) ; WINDOWS: $x0 = COPY %ptr_add(p0) ; WINDOWS: RET_ReallyLR implicit $x0 %global:_(p0) = G_GLOBAL_VALUE @extern_weak_linkage %imm:_(s64) = G_CONSTANT i64 1 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) $x0 = COPY %ptr_add(p0) RET_ReallyLR implicit $x0 ... --- name: never_fold_tagged_globals alignment: 4 tracksRegLiveness: true machineFunctionInfo: {} body: | bb.0: ; CHECK-LABEL: name: never_fold_tagged_globals ; CHECK-NOT: %global:_(p0) = G_GLOBAL_VALUE @external_linkage + 1 %global:_(p0) = G_GLOBAL_VALUE @external_linkage %imm:_(s64) = G_CONSTANT i64 1 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) $x0 = COPY %ptr_add(p0) RET_ReallyLR implicit $x0 ... --- name: test_dll_import alignment: 4 tracksRegLiveness: true machineFunctionInfo: {} body: | bb.0: ; CHECK-LABEL: name: test_dll_import ; CHECK-NOT: %global:_(p0) = G_GLOBAL_VALUE @dll_import + 1 %global:_(p0) = G_GLOBAL_VALUE @dll_import %imm:_(s64) = G_CONSTANT i64 1 %ptr_add:_(p0) = G_PTR_ADD %global, %imm(s64) $x0 = COPY %ptr_add(p0) RET_ReallyLR implicit $x0