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 %s -o - | FileCheck %s 3 4--- 5name: mul_to_lshr 6alignment: 4 7tracksRegLiveness: true 8frameInfo: 9 maxAlignment: 1 10machineFunctionInfo: {} 11body: | 12 bb.0: 13 liveins: $x0 14 ; CHECK-LABEL: name: mul_to_lshr 15 ; CHECK: liveins: $x0 16 ; CHECK-NEXT: {{ $}} 17 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 18 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 61 19 ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s64) = G_LSHR [[COPY]], [[C]](s64) 20 ; CHECK-NEXT: $x0 = COPY [[LSHR]](s64) 21 %0:_(s64) = COPY $x0 22 %1:_(s64) = G_CONSTANT i64 8 23 %2:_(s64) = G_UMULH %0, %1(s64) 24 $x0 = COPY %2(s64) 25... 26--- 27name: mul_to_lshr_vector 28alignment: 4 29tracksRegLiveness: true 30frameInfo: 31 maxAlignment: 1 32machineFunctionInfo: {} 33body: | 34 bb.0: 35 liveins: $q0 36 ; CHECK-LABEL: name: mul_to_lshr_vector 37 ; CHECK: liveins: $q0 38 ; CHECK-NEXT: {{ $}} 39 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 40 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 29 41 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32) 42 ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(<4 x s32>) = G_LSHR [[COPY]], [[BUILD_VECTOR]](<4 x s32>) 43 ; CHECK-NEXT: $q0 = COPY [[LSHR]](<4 x s32>) 44 %0:_(<4 x s32>) = COPY $q0 45 %1:_(s32) = G_CONSTANT i32 8 46 %bv:_(<4 x s32>) = G_BUILD_VECTOR %1, %1, %1, %1 47 %2:_(<4 x s32>) = G_UMULH %0, %bv(<4 x s32>) 48 $q0 = COPY %2(<4 x s32>) 49... 50--- 51name: mul_to_lshr_vector_out_of_range_shift 52alignment: 4 53tracksRegLiveness: true 54frameInfo: 55 maxAlignment: 1 56machineFunctionInfo: {} 57body: | 58 bb.0: 59 liveins: $q0 60 ; CHECK-LABEL: name: mul_to_lshr_vector_out_of_range_shift 61 ; CHECK: liveins: $q0 62 ; CHECK-NEXT: {{ $}} 63 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 64 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 1 65 ; CHECK-NEXT: %bv:_(<4 x s32>) = G_BUILD_VECTOR [[C]](s32), [[C]](s32), [[C]](s32), [[C]](s32) 66 ; CHECK-NEXT: [[UMULH:%[0-9]+]]:_(<4 x s32>) = G_UMULH [[COPY]], %bv 67 ; CHECK-NEXT: $q0 = COPY [[UMULH]](<4 x s32>) 68 %0:_(<4 x s32>) = COPY $q0 69 %1:_(s32) = G_CONSTANT i32 1 70 %bv:_(<4 x s32>) = G_BUILD_VECTOR %1, %1, %1, %1 71 %2:_(<4 x s32>) = G_UMULH %0, %bv(<4 x s32>) 72 $q0 = COPY %2(<4 x s32>) 73... 74--- 75name: mul_to_lshr_out_of_range_shift 76alignment: 4 77tracksRegLiveness: true 78frameInfo: 79 maxAlignment: 1 80machineFunctionInfo: {} 81body: | 82 bb.0: 83 liveins: $x0 84 ; CHECK-LABEL: name: mul_to_lshr_out_of_range_shift 85 ; CHECK: liveins: $x0 86 ; CHECK-NEXT: {{ $}} 87 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 88 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 89 ; CHECK-NEXT: [[UMULH:%[0-9]+]]:_(s64) = G_UMULH [[COPY]], [[C]] 90 ; CHECK-NEXT: $x0 = COPY [[UMULH]](s64) 91 %0:_(s64) = COPY $x0 92 %1:_(s64) = G_CONSTANT i64 1 93 %2:_(s64) = G_UMULH %0, %1(s64) 94 $x0 = COPY %2(s64) 95... 96--- 97name: mul_to_lshr_vector_nonuniform_const 98alignment: 4 99tracksRegLiveness: true 100frameInfo: 101 maxAlignment: 1 102machineFunctionInfo: {} 103body: | 104 bb.0: 105 liveins: $q0 106 ; CHECK-LABEL: name: mul_to_lshr_vector_nonuniform_const 107 ; CHECK: liveins: $q0 108 ; CHECK-NEXT: {{ $}} 109 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 110 ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 28 111 ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 27 112 ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s32) = G_CONSTANT i32 26 113 ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s32) = G_CONSTANT i32 29 114 ; CHECK-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[C3]](s32), [[C]](s32), [[C1]](s32), [[C2]](s32) 115 ; CHECK-NEXT: %mulh:_(<4 x s32>) = G_LSHR [[COPY]], [[BUILD_VECTOR]](<4 x s32>) 116 ; CHECK-NEXT: $q0 = COPY %mulh(<4 x s32>) 117 %0:_(<4 x s32>) = COPY $q0 118 %cst1:_(s32) = G_CONSTANT i32 8 119 %cst2:_(s32) = G_CONSTANT i32 16 120 %cst3:_(s32) = G_CONSTANT i32 32 121 %cst4:_(s32) = G_CONSTANT i32 64 122 %bv:_(<4 x s32>) = G_BUILD_VECTOR %cst1, %cst2, %cst3, %cst4 123 %mulh:_(<4 x s32>) = G_UMULH %0, %bv(<4 x s32>) 124 $q0 = COPY %mulh(<4 x s32>) 125... 126--- 127name: mul_to_lshr_vector_nonuniform_const_elt_is_one 128alignment: 4 129tracksRegLiveness: true 130frameInfo: 131 maxAlignment: 1 132machineFunctionInfo: {} 133body: | 134 bb.0: 135 liveins: $q0 136 ; CHECK-LABEL: name: mul_to_lshr_vector_nonuniform_const_elt_is_one 137 ; CHECK: liveins: $q0 138 ; CHECK-NEXT: {{ $}} 139 ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(<4 x s32>) = COPY $q0 140 ; CHECK-NEXT: %cst1:_(s32) = G_CONSTANT i32 8 141 ; CHECK-NEXT: %cst2:_(s32) = G_CONSTANT i32 1 142 ; CHECK-NEXT: %cst3:_(s32) = G_CONSTANT i32 32 143 ; CHECK-NEXT: %cst4:_(s32) = G_CONSTANT i32 64 144 ; CHECK-NEXT: %bv:_(<4 x s32>) = G_BUILD_VECTOR %cst1(s32), %cst2(s32), %cst3(s32), %cst4(s32) 145 ; CHECK-NEXT: %mulh:_(<4 x s32>) = G_UMULH [[COPY]], %bv 146 ; CHECK-NEXT: $q0 = COPY %mulh(<4 x s32>) 147 %0:_(<4 x s32>) = COPY $q0 148 %cst1:_(s32) = G_CONSTANT i32 8 149 %cst2:_(s32) = G_CONSTANT i32 1 150 %cst3:_(s32) = G_CONSTANT i32 32 151 %cst4:_(s32) = G_CONSTANT i32 64 152 %bv:_(<4 x s32>) = G_BUILD_VECTOR %cst1, %cst2, %cst3, %cst4 153 %mulh:_(<4 x s32>) = G_UMULH %0, %bv(<4 x s32>) 154 $q0 = COPY %mulh(<4 x s32>) 155... 156