209 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple=aarch64-unknown-unknown -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s3#4# Test using the xro addressing mode with immediates. This should be done for5# wide constants which are preferably selected using a mov rather than an add.6 7...8---9name: use_xro_cannot_encode_add_lsl10alignment: 411legalized: true12regBankSelected: true13tracksRegLiveness: true14body: |15 bb.0:16 liveins: $x017 ; Check that we use the XRO addressing mode when the constant cannot be18 ; represented using an add + lsl.19 ; cst = 000000011100000020 ; cst & 000fffffff000000 != 021 ; CHECK-LABEL: name: use_xro_cannot_encode_add_lsl22 ; CHECK: liveins: $x023 ; CHECK-NEXT: {{ $}}24 ; CHECK-NEXT: %copy:gpr64sp = COPY $x025 ; CHECK-NEXT: %cst:gpr64 = MOVi64imm 458017996826 ; CHECK-NEXT: %load:gpr64 = LDRXroX %copy, %cst, 0, 0 :: (volatile load (s64))27 ; CHECK-NEXT: RET_ReallyLR28 %copy:gpr(p0) = COPY $x029 %cst:gpr(s64) = G_CONSTANT i64 458017996830 %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)31 %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))32 RET_ReallyLR33 34...35---36name: use_xro_preferred_mov37alignment: 438legalized: true39regBankSelected: true40tracksRegLiveness: true41body: |42 bb.0:43 liveins: $x044 ; Check that we use the XRO addressing mode when the constant can be45 ; represented using a single movk.46 ; cst = 000000000000f00047 ; cst & 000fffffff000000 == 048 ; cst & ffffffffffff0fff != 049 ; CHECK-LABEL: name: use_xro_preferred_mov50 ; CHECK: liveins: $x051 ; CHECK-NEXT: {{ $}}52 ; CHECK-NEXT: %copy:gpr64sp = COPY $x053 ; CHECK-NEXT: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 6144054 ; CHECK-NEXT: %cst:gpr64 = SUBREG_TO_REG 0, [[MOVi32imm]], %subreg.sub_3255 ; CHECK-NEXT: %load:gpr64 = LDRXroX %copy, %cst, 0, 0 :: (volatile load (s64))56 ; CHECK-NEXT: RET_ReallyLR57 %copy:gpr(p0) = COPY $x058 %cst:gpr(s64) = G_CONSTANT i64 6144059 %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)60 %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))61 RET_ReallyLR62 63...64---65name: use_xro_negative_imm66alignment: 467legalized: true68regBankSelected: true69tracksRegLiveness: true70body: |71 bb.0:72 liveins: $x073 ; Check that this works even if we have a negative immediate.74 ; CHECK-LABEL: name: use_xro_negative_imm75 ; CHECK: liveins: $x076 ; CHECK-NEXT: {{ $}}77 ; CHECK-NEXT: %copy:gpr64sp = COPY $x078 ; CHECK-NEXT: %cst:gpr64 = MOVi64imm -6144079 ; CHECK-NEXT: %load:gpr64 = LDRXroX %copy, %cst, 0, 0 :: (volatile load (s64))80 ; CHECK-NEXT: RET_ReallyLR81 %copy:gpr(p0) = COPY $x082 %cst:gpr(s64) = G_CONSTANT i64 -6144083 %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)84 %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))85 RET_ReallyLR86 87...88---89name: dont_use_xro_selectable_imm90alignment: 491legalized: true92regBankSelected: true93tracksRegLiveness: true94body: |95 bb.0:96 liveins: $x097 ; Immediates that can be encoded in a LDRXui should be skipped.98 ; CHECK-LABEL: name: dont_use_xro_selectable_imm99 ; CHECK: liveins: $x0100 ; CHECK-NEXT: {{ $}}101 ; CHECK-NEXT: %copy:gpr64sp = COPY $x0102 ; CHECK-NEXT: %load:gpr64 = LDRXui %copy, 2 :: (volatile load (s64))103 ; CHECK-NEXT: RET_ReallyLR104 %copy:gpr(p0) = COPY $x0105 %cst:gpr(s64) = G_CONSTANT i64 16106 %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)107 %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))108 RET_ReallyLR109 110...111---112name: dont_use_xro_selectable_negative_imm113alignment: 4114legalized: true115regBankSelected: true116tracksRegLiveness: true117body: |118 bb.0:119 liveins: $x0120 ; Immediates that can be encoded in a LDRXui should be skipped.121 ; CHECK-LABEL: name: dont_use_xro_selectable_negative_imm122 ; CHECK: liveins: $x0123 ; CHECK-NEXT: {{ $}}124 ; CHECK-NEXT: %copy:gpr64sp = COPY $x0125 ; CHECK-NEXT: %load:gpr64 = LDURXi %copy, -16 :: (volatile load (s64))126 ; CHECK-NEXT: RET_ReallyLR127 %copy:gpr(p0) = COPY $x0128 %cst:gpr(s64) = G_CONSTANT i64 -16129 %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)130 %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))131 RET_ReallyLR132 133...134---135name: dont_use_xro_zero136alignment: 4137legalized: true138regBankSelected: true139tracksRegLiveness: true140body: |141 bb.0:142 liveins: $x0143 ; Immediates that can be encoded in a LDRXui should be skipped.144 ; CHECK-LABEL: name: dont_use_xro_zero145 ; CHECK: liveins: $x0146 ; CHECK-NEXT: {{ $}}147 ; CHECK-NEXT: %copy:gpr64sp = COPY $x0148 ; CHECK-NEXT: %load:gpr64 = LDRXui %copy, 0 :: (volatile load (s64))149 ; CHECK-NEXT: RET_ReallyLR150 %copy:gpr(p0) = COPY $x0151 %cst:gpr(s64) = G_CONSTANT i64 0152 %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)153 %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))154 RET_ReallyLR155 156...157---158name: dont_use_xro_in_range159alignment: 4160legalized: true161regBankSelected: true162tracksRegLiveness: true163body: |164 bb.0:165 liveins: $x0166 ; Check that we skip constants which can be encoded in an add.167 ; 17 is in [0x0, 0xfff]168 ; CHECK-LABEL: name: dont_use_xro_in_range169 ; CHECK: liveins: $x0170 ; CHECK-NEXT: {{ $}}171 ; CHECK-NEXT: %copy:gpr64sp = COPY $x0172 ; CHECK-NEXT: %load:gpr64 = LDURXi %copy, 17 :: (volatile load (s64))173 ; CHECK-NEXT: RET_ReallyLR174 %copy:gpr(p0) = COPY $x0175 %cst:gpr(s64) = G_CONSTANT i64 17176 %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)177 %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))178 RET_ReallyLR179 180...181---182name: dont_use_xro_add_lsl183alignment: 4184legalized: true185regBankSelected: true186tracksRegLiveness: true187body: |188 bb.0:189 liveins: $x0190 ; Check that we skip when we have an add with an lsl which cannot be191 ; represented as a movk.192 ; cst = 0x0000000000111000193 ; cst & 000fffffff000000 = 0194 ; cst & ffffffffff00ffff != 0195 ; cst & ffffffffffff0fff != 0196 ; CHECK-LABEL: name: dont_use_xro_add_lsl197 ; CHECK: liveins: $x0198 ; CHECK-NEXT: {{ $}}199 ; CHECK-NEXT: %copy:gpr64 = COPY $x0200 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64common = COPY %copy201 ; CHECK-NEXT: %addr:gpr64sp = ADDXri [[COPY]], 273, 12202 ; CHECK-NEXT: %load:gpr64 = LDRXui %addr, 0 :: (volatile load (s64))203 ; CHECK-NEXT: RET_ReallyLR204 %copy:gpr(p0) = COPY $x0205 %cst:gpr(s64) = G_CONSTANT i64 1118208206 %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)207 %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load (s64))208 RET_ReallyLR209