| # 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 |