86 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -debugify-and-strip-all-safe -mtriple aarch64 -O0 -run-pass=aarch64-prelegalizer-combiner --aarch64prelegalizercombiner-only-enable-rule="load_or_combine" -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=NOT_STRICT3# RUN: llc -debugify-and-strip-all-safe -mattr=+strict-align -mtriple aarch64 -O0 -run-pass=aarch64-prelegalizer-combiner --aarch64prelegalizercombiner-only-enable-rule="load_or_combine" -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=STRICT4 5# REQUIRES: asserts6 7# Check that the load-or combine respects alignment requirements.8...9---10name: misaligned11tracksRegLiveness: true12body: |13 bb.0:14 liveins: $x0, $x115 ; NOT_STRICT-LABEL: name: misaligned16 ; NOT_STRICT: liveins: $x0, $x117 ; NOT_STRICT-NEXT: {{ $}}18 ; NOT_STRICT-NEXT: %ptr:_(p0) = COPY $x119 ; NOT_STRICT-NEXT: %full_load:_(s32) = G_LOAD %ptr(p0) :: (load (s32), align 2)20 ; NOT_STRICT-NEXT: $w1 = COPY %full_load(s32)21 ; NOT_STRICT-NEXT: RET_ReallyLR implicit $w122 ;23 ; STRICT-LABEL: name: misaligned24 ; STRICT: liveins: $x0, $x125 ; STRICT-NEXT: {{ $}}26 ; STRICT-NEXT: %cst_1:_(s64) = G_CONSTANT i64 127 ; STRICT-NEXT: %cst_16:_(s32) = G_CONSTANT i32 1628 ; STRICT-NEXT: %ptr:_(p0) = COPY $x129 ; STRICT-NEXT: %ptr_elt_1:_(p0) = G_PTR_ADD %ptr, %cst_1(s64)30 ; STRICT-NEXT: %low_half:_(s32) = G_ZEXTLOAD %ptr(p0) :: (load (s16))31 ; STRICT-NEXT: %elt1:_(s32) = G_ZEXTLOAD %ptr_elt_1(p0) :: (load (s16))32 ; STRICT-NEXT: %high_half:_(s32) = nuw G_SHL %elt1, %cst_16(s32)33 ; STRICT-NEXT: %full_load:_(s32) = G_OR %low_half, %high_half34 ; STRICT-NEXT: $w1 = COPY %full_load(s32)35 ; STRICT-NEXT: RET_ReallyLR implicit $w136 %cst_1:_(s64) = G_CONSTANT i64 137 %cst_16:_(s32) = G_CONSTANT i32 1638 39 %ptr:_(p0) = COPY $x140 %ptr_elt_1:_(p0) = G_PTR_ADD %ptr, %cst_1(s64)41 42 %low_half:_(s32) = G_ZEXTLOAD %ptr(p0) :: (load (s16), align 2)43 %elt1:_(s32) = G_ZEXTLOAD %ptr_elt_1(p0) :: (load (s16), align 2)44 %high_half:_(s32) = nuw G_SHL %elt1, %cst_16(s32)45 46 %full_load:_(s32) = G_OR %low_half, %high_half47 $w1 = COPY %full_load(s32)48 RET_ReallyLR implicit $w149 50...51---52name: aligned53tracksRegLiveness: true54body: |55 bb.0:56 liveins: $x0, $x157 58 ; NOT_STRICT-LABEL: name: aligned59 ; NOT_STRICT: liveins: $x0, $x160 ; NOT_STRICT-NEXT: {{ $}}61 ; NOT_STRICT-NEXT: %ptr:_(p0) = COPY $x162 ; NOT_STRICT-NEXT: %full_load:_(s32) = G_LOAD %ptr(p0) :: (load (s32))63 ; NOT_STRICT-NEXT: $w1 = COPY %full_load(s32)64 ; NOT_STRICT-NEXT: RET_ReallyLR implicit $w165 ;66 ; STRICT-LABEL: name: aligned67 ; STRICT: liveins: $x0, $x168 ; STRICT-NEXT: {{ $}}69 ; STRICT-NEXT: %ptr:_(p0) = COPY $x170 ; STRICT-NEXT: %full_load:_(s32) = G_LOAD %ptr(p0) :: (load (s32))71 ; STRICT-NEXT: $w1 = COPY %full_load(s32)72 ; STRICT-NEXT: RET_ReallyLR implicit $w173 %cst_1:_(s64) = G_CONSTANT i64 174 %cst_16:_(s32) = G_CONSTANT i32 1675 76 %ptr:_(p0) = COPY $x177 %ptr_elt_1:_(p0) = G_PTR_ADD %ptr, %cst_1(s64)78 79 %low_half:_(s32) = G_ZEXTLOAD %ptr(p0) :: (load (s16), align 4)80 %elt1:_(s32) = G_ZEXTLOAD %ptr_elt_1(p0) :: (load (s16), align 4)81 %high_half:_(s32) = nuw G_SHL %elt1, %cst_16(s32)82 83 %full_load:_(s32) = G_OR %low_half, %high_half84 $w1 = COPY %full_load(s32)85 RET_ReallyLR implicit $w186