1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs -mtriple aarch64-unknown-unknown --aarch64prelegalizercombiner-only-enable-rule="reassoc_ptradd" %s -o - | FileCheck %s 3# REQUIRES: asserts 4 5--- 6name: test1_noreassoc_legal_already_new_is_illegal 7alignment: 4 8tracksRegLiveness: true 9liveins: 10 - { reg: '$x0' } 11body: | 12 bb.1: 13 liveins: $x0 14 15 ; CHECK-LABEL: name: test1_noreassoc_legal_already_new_is_illegal 16 ; CHECK: liveins: $x0 17 ; CHECK-NEXT: {{ $}} 18 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 19 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1600 20 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 6 21 ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 22 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s64) 23 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD]], [[C1]](s64) 24 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD1]](p0) :: (load (s32)) 25 ; CHECK-NEXT: G_STORE [[C2]](s32), [[PTR_ADD]](p0) :: (store (s32)) 26 ; CHECK-NEXT: $w0 = COPY [[LOAD]](s32) 27 ; CHECK-NEXT: RET_ReallyLR implicit $w0 28 %0:_(p0) = COPY $x0 29 %2:_(s64) = G_CONSTANT i64 1600 30 %4:_(s64) = G_CONSTANT i64 6 31 %9:_(s32) = G_CONSTANT i32 0 32 %10:_(p0) = G_PTR_ADD %0, %2(s64) 33 %11:_(p0) = G_PTR_ADD %10, %4(s64) 34 %7:_(s32) = G_LOAD %11(p0) :: (load 4) 35 G_STORE %9(s32), %10(p0) :: (store 4) ; other use of %10 36 $w0 = COPY %7(s32) 37 RET_ReallyLR implicit $w0 38 39... 40--- 41name: test2_reassoc_already_legal_new_also_legal 42alignment: 4 43liveins: 44 - { reg: '$x0' } 45body: | 46 bb.1: 47 liveins: $x0 48 49 ; CHECK-LABEL: name: test2_reassoc_already_legal_new_also_legal 50 ; CHECK: liveins: $x0 51 ; CHECK-NEXT: {{ $}} 52 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 53 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 10 54 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 55 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s64) 56 ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 16 57 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C2]](s64) 58 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD1]](p0) :: (load (s32)) 59 ; CHECK-NEXT: G_STORE [[C1]](s32), [[PTR_ADD]](p0) :: (store (s32)) 60 ; CHECK-NEXT: $w0 = COPY [[LOAD]](s32) 61 ; CHECK-NEXT: RET_ReallyLR implicit $w0 62 %0:_(p0) = COPY $x0 63 %2:_(s64) = G_CONSTANT i64 10 64 %4:_(s64) = G_CONSTANT i64 6 65 %9:_(s32) = G_CONSTANT i32 0 66 %10:_(p0) = G_PTR_ADD %0, %2(s64) 67 %11:_(p0) = G_PTR_ADD %10, %4(s64) 68 %7:_(s32) = G_LOAD %11(p0) :: (load 4) 69 G_STORE %9(s32), %10(p0) :: (store 4) ; other use of %10 70 $w0 = COPY %7(s32) 71 RET_ReallyLR implicit $w0 72 73... 74--- 75name: test3_noreassoc_only_oneuse 76alignment: 4 77liveins: 78 - { reg: '$x0' } 79body: | 80 bb.1: 81 liveins: $x0 82 83 ; CHECK-LABEL: name: test3_noreassoc_only_oneuse 84 ; CHECK: liveins: $x0 85 ; CHECK-NEXT: {{ $}} 86 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 87 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 4783 88 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s64) 89 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD]](p0) :: (load (s32)) 90 ; CHECK-NEXT: $w0 = COPY [[LOAD]](s32) 91 ; CHECK-NEXT: RET_ReallyLR implicit $w0 92 %0:_(p0) = COPY $x0 93 %10:_(s64) = G_CONSTANT i64 4783 94 %9:_(p0) = G_PTR_ADD %0, %10(s64) 95 %7:_(s32) = G_LOAD %9(p0) :: (load 4) 96 $w0 = COPY %7(s32) 97 RET_ReallyLR implicit $w0 98 99... 100--- 101name: test4_reassoc_existing_is_already_illegal 102alignment: 4 103liveins: 104 - { reg: '$x0' } 105body: | 106 bb.1: 107 liveins: $x0 108 109 ; CHECK-LABEL: name: test4_reassoc_existing_is_already_illegal 110 ; CHECK: liveins: $x0 111 ; CHECK-NEXT: {{ $}} 112 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 113 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 17 114 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 115 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s64) 116 ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 4096 117 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C2]](s64) 118 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD1]](p0) :: (load (s32)) 119 ; CHECK-NEXT: G_STORE [[C1]](s32), [[PTR_ADD]](p0) :: (store (s32)) 120 ; CHECK-NEXT: $w0 = COPY [[LOAD]](s32) 121 ; CHECK-NEXT: RET_ReallyLR implicit $w0 122 %0:_(p0) = COPY $x0 123 %2:_(s64) = G_CONSTANT i64 17 124 %4:_(s64) = G_CONSTANT i64 4079 125 %9:_(s32) = G_CONSTANT i32 0 126 %10:_(p0) = G_PTR_ADD %0, %2(s64) 127 %11:_(p0) = G_PTR_ADD %10, %4(s64) 128 %7:_(s32) = G_LOAD %11(p0) :: (load 4) 129 G_STORE %9(s32), %10(p0) :: (store 4) ; other use of %10 130 $w0 = COPY %7(s32) 131 RET_ReallyLR implicit $w0 132 133... 134--- 135name: test5_add_on_rhs 136alignment: 4 137liveins: 138 - { reg: '$x0' } 139 - { reg: '$x1' } 140body: | 141 bb.1: 142 liveins: $x0, $x1 143 144 ; CHECK-LABEL: name: test5_add_on_rhs 145 ; CHECK: liveins: $x0, $x1 146 ; CHECK-NEXT: {{ $}} 147 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 148 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1 149 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 150 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[COPY1]](s64) 151 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD]], [[C]](s64) 152 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD1]](p0) :: (load (s8)) 153 ; CHECK-NEXT: $w0 = COPY [[LOAD]](s32) 154 ; CHECK-NEXT: RET_ReallyLR implicit $w0 155 %0:_(p0) = COPY $x0 156 %1:_(s64) = COPY $x1 157 %2:_(s64) = G_CONSTANT i64 1 158 %3:_(s64) = G_ADD %1, %2 159 %4:_(p0) = G_PTR_ADD %0, %3(s64) 160 %7:_(s32) = G_LOAD %4(p0) :: (load 1) 161 $w0 = COPY %7(s32) 162 RET_ReallyLR implicit $w0 163 164... 165--- 166name: walk_through_inttoptr 167alignment: 4 168tracksRegLiveness: true 169body: | 170 bb.1: 171 liveins: $x0 172 ; CHECK-LABEL: name: walk_through_inttoptr 173 ; CHECK: liveins: $x0 174 ; CHECK-NEXT: {{ $}} 175 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 176 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1600 177 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 0 178 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s64) 179 ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 1606 180 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C2]](s64) 181 ; CHECK-NEXT: %ptr_to_int:_(s64) = G_PTRTOINT [[PTR_ADD1]](p0) 182 ; CHECK-NEXT: %int_to_ptr:_(p0) = G_INTTOPTR %ptr_to_int(s64) 183 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD %int_to_ptr(p0) :: (load (s32)) 184 ; CHECK-NEXT: G_STORE [[C1]](s32), [[PTR_ADD]](p0) :: (store (s32)) 185 ; CHECK-NEXT: G_STORE %ptr_to_int(s64), [[PTR_ADD]](p0) :: (store (s64)) 186 ; CHECK-NEXT: $w0 = COPY [[LOAD]](s32) 187 ; CHECK-NEXT: RET_ReallyLR implicit $w0 188 %0:_(p0) = COPY $x0 189 %2:_(s64) = G_CONSTANT i64 1600 190 %4:_(s64) = G_CONSTANT i64 6 191 %9:_(s32) = G_CONSTANT i32 0 192 %10:_(p0) = G_PTR_ADD %0, %2(s64) 193 %11:_(p0) = G_PTR_ADD %10, %4(s64) 194 %ptr_to_int:_(s64) = G_PTRTOINT %11 195 %int_to_ptr:_(p0) = G_INTTOPTR %ptr_to_int 196 %7:_(s32) = G_LOAD %int_to_ptr(p0) :: (load 4) 197 G_STORE %9(s32), %10(p0) :: (store 4) ; other use of %10 198 G_STORE %ptr_to_int(s64), %10(p0) :: (store 8) 199 $w0 = COPY %7(s32) 200 RET_ReallyLR implicit $w0 201... 202--- 203name: reassoc_cst_inner_lhs 204alignment: 4 205tracksRegLiveness: true 206liveins: 207 - { reg: '$w0' } 208 - { reg: '$x1' } 209 - { reg: '$x2' } 210 - { reg: '$x3' } 211body: | 212 bb.1: 213 liveins: $w0, $x1, $x2, $x3 214 215 ; CHECK-LABEL: name: reassoc_cst_inner_lhs 216 ; CHECK: liveins: $w0, $x1, $x2, $x3 217 ; CHECK-NEXT: {{ $}} 218 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2 219 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x3 220 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 40 221 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 222 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY1]], [[C1]](s64) 223 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[SHL]](s64) 224 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD]], [[C]](s64) 225 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD1]](p0) :: (load (s32)) 226 ; CHECK-NEXT: $w0 = COPY [[LOAD]](s32) 227 ; CHECK-NEXT: RET_ReallyLR 228 %1:_(p0) = COPY $x1 229 %2:_(p0) = COPY $x2 230 %3:_(s64) = COPY $x3 231 %8:_(s64) = G_CONSTANT i64 40 232 %9:_(p0) = G_PTR_ADD %2, %8(s64) 233 %10:_(s64) = G_CONSTANT i64 2 234 %11:_(s64) = G_SHL %3, %10 235 %12:_(p0) = G_PTR_ADD %9, %11(s64) 236 %14:_(s32) = G_LOAD %12(p0) :: (load (s32)) 237 $w0 = COPY %14 238 RET_ReallyLR 239 240... 241--- 242name: reassoc_cst_inner_lhs_multiuse 243alignment: 4 244tracksRegLiveness: true 245liveins: 246 - { reg: '$w0' } 247 - { reg: '$x1' } 248 - { reg: '$x2' } 249 - { reg: '$x3' } 250body: | 251 bb.1: 252 liveins: $w0, $x1, $x2, $x3 253 254 ; CHECK-LABEL: name: reassoc_cst_inner_lhs_multiuse 255 ; CHECK: liveins: $w0, $x1, $x2, $x3 256 ; CHECK-NEXT: {{ $}} 257 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x2 258 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x3 259 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 40 260 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY]], [[C]](s64) 261 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 262 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY1]], [[C1]](s64) 263 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD]], [[SHL]](s64) 264 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD1]](p0) :: (load (s32)) 265 ; CHECK-NEXT: $w0 = COPY [[LOAD]](s32) 266 ; CHECK-NEXT: $x0 = COPY [[PTR_ADD]](p0) 267 ; CHECK-NEXT: RET_ReallyLR 268 %1:_(p0) = COPY $x1 269 %2:_(p0) = COPY $x2 270 %3:_(s64) = COPY $x3 271 %8:_(s64) = G_CONSTANT i64 40 272 %9:_(p0) = G_PTR_ADD %2, %8(s64) 273 %10:_(s64) = G_CONSTANT i64 2 274 %11:_(s64) = G_SHL %3, %10 275 %12:_(p0) = G_PTR_ADD %9, %11(s64) 276 %14:_(s32) = G_LOAD %12(p0) :: (load (s32)) 277 $w0 = COPY %14 278 $x0 = COPY %9 279 RET_ReallyLR 280 281... 282--- 283name: reassoc_cst_inner_lhs_const_lhs 284alignment: 4 285tracksRegLiveness: true 286liveins: 287 - { reg: '$w0' } 288 - { reg: '$x1' } 289 - { reg: '$x2' } 290 - { reg: '$x3' } 291body: | 292 bb.1: 293 liveins: $w0, $x1, $x2, $x3 294 295 ; CHECK-LABEL: name: reassoc_cst_inner_lhs_const_lhs 296 ; CHECK: liveins: $w0, $x1, $x2, $x3 297 ; CHECK-NEXT: {{ $}} 298 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x2 299 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $x3 300 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 40 301 ; CHECK-NEXT: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[C]](s64) 302 ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[INTTOPTR]], [[COPY]](s64) 303 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 304 ; CHECK-NEXT: [[SHL:%[0-9]+]]:_(s64) = G_SHL [[COPY1]], [[C1]](s64) 305 ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[PTR_ADD]], [[SHL]](s64) 306 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[PTR_ADD1]](p0) :: (load (s32)) 307 ; CHECK-NEXT: $w0 = COPY [[LOAD]](s32) 308 ; CHECK-NEXT: RET_ReallyLR 309 %1:_(p0) = COPY $x1 310 %2:_(s64) = COPY $x2 311 %3:_(s64) = COPY $x3 312 %8:_(s64) = G_CONSTANT i64 40 313 %9:_(p0) = G_INTTOPTR %8(s64) 314 %10:_(p0) = G_PTR_ADD %9, %2(s64) 315 %11:_(s64) = G_CONSTANT i64 2 316 %12:_(s64) = G_SHL %3, %11 317 %13:_(p0) = G_PTR_ADD %10, %12(s64) 318 %15:_(s32) = G_LOAD %13(p0) :: (load (s32)) 319 $w0 = COPY %15 320 RET_ReallyLR 321 322... 323