181 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -mtriple=aarch64-apple-darwin -run-pass=regbankselect -verify-machineinstrs %s -o - | FileCheck %s3 4...5---6name: select_f327alignment: 48legalized: true9tracksRegLiveness: true10machineFunctionInfo: {}11body: |12 bb.0:13 liveins: $s0, $s1, $w014 15 ; CHECK-LABEL: name: select_f3216 ; CHECK: liveins: $s0, $s1, $w017 ; CHECK-NEXT: {{ $}}18 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w019 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s32) = COPY $s020 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr(s32) = COPY $s121 ; CHECK-NEXT: [[SELECT:%[0-9]+]]:fpr(s32) = G_SELECT [[COPY]](s32), [[COPY1]], [[COPY2]]22 ; CHECK-NEXT: $s0 = COPY [[SELECT]](s32)23 ; CHECK-NEXT: RET_ReallyLR implicit $s024 %3:_(s32) = COPY $w025 %1:_(s32) = COPY $s026 %2:_(s32) = COPY $s127 %4:_(s32) = G_SELECT %3, %1, %228 $s0 = COPY %4(s32)29 RET_ReallyLR implicit $s030 31...32---33name: select_f6434alignment: 435legalized: true36tracksRegLiveness: true37machineFunctionInfo: {}38body: |39 bb.0:40 liveins: $d0, $d1, $w041 42 ; CHECK-LABEL: name: select_f6443 ; CHECK: liveins: $d0, $d1, $w044 ; CHECK-NEXT: {{ $}}45 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w046 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d047 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr(s64) = COPY $d148 ; CHECK-NEXT: [[SELECT:%[0-9]+]]:fpr(s64) = G_SELECT [[COPY]](s32), [[COPY1]], [[COPY2]]49 ; CHECK-NEXT: $d0 = COPY [[SELECT]](s64)50 ; CHECK-NEXT: RET_ReallyLR implicit $d051 %3:_(s32) = COPY $w052 %1:_(s64) = COPY $d053 %2:_(s64) = COPY $d154 %4:_(s64) = G_SELECT %3, %1, %255 $d0 = COPY %4(s64)56 RET_ReallyLR implicit $d057 58...59---60name: two_fpr_inputs_gpr_output61alignment: 462legalized: true63tracksRegLiveness: true64machineFunctionInfo: {}65body: |66 bb.0:67 liveins: $d0, $d1, $w068 69 ; Verify that the G_SELECT only has FPRs.70 ; The only difference between fcsel and csel are the register banks. So,71 ; if we have two FPR inputs and a GPR output, we should do a floating point72 ; select anyway. This will cost one copy for the output, but that's less73 ; than doing two to put the inputs on GPRs.74 75 ; CHECK-LABEL: name: two_fpr_inputs_gpr_output76 ; CHECK: liveins: $d0, $d1, $w077 ; CHECK-NEXT: {{ $}}78 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w079 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d080 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:fpr(s64) = COPY $d181 ; CHECK-NEXT: [[SELECT:%[0-9]+]]:fpr(s64) = G_SELECT [[COPY]](s32), [[COPY1]], [[COPY2]]82 ; CHECK-NEXT: $x0 = COPY [[SELECT]](s64)83 ; CHECK-NEXT: RET_ReallyLR implicit $x084 %3:_(s32) = COPY $w085 %1:_(s64) = COPY $d086 %2:_(s64) = COPY $d187 %4:_(s64) = G_SELECT %3, %1, %288 $x0 = COPY %4(s64)89 RET_ReallyLR implicit $x090 91...92---93name: one_fpr_input_fpr_output94alignment: 495legalized: true96tracksRegLiveness: true97machineFunctionInfo: {}98body: |99 bb.0:100 liveins: $d0, $x1, $w0101 102 ; Same idea as the above test. If the output is an FPR, and one of the103 ; inputs is an FPR, then it's fewer copies to just do a FCSEL.104 105 ; CHECK-LABEL: name: one_fpr_input_fpr_output106 ; CHECK: liveins: $d0, $x1, $w0107 ; CHECK-NEXT: {{ $}}108 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0109 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d0110 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr(s64) = COPY $x1111 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:fpr(s64) = COPY [[COPY2]](s64)112 ; CHECK-NEXT: [[SELECT:%[0-9]+]]:fpr(s64) = G_SELECT [[COPY]](s32), [[COPY1]], [[COPY3]]113 ; CHECK-NEXT: $d0 = COPY [[SELECT]](s64)114 ; CHECK-NEXT: RET_ReallyLR implicit $d0115 %3:_(s32) = COPY $w0116 %1:_(s64) = COPY $d0117 %2:_(s64) = COPY $x1118 %4:_(s64) = G_SELECT %3, %1, %2119 $d0 = COPY %4(s64)120 RET_ReallyLR implicit $d0121 122...123---124name: one_fpr_input_gpr_output125alignment: 4126legalized: true127tracksRegLiveness: true128machineFunctionInfo: {}129body: |130 bb.0:131 liveins: $d0, $x1, $w0132 133 ; Now we have more GPR registers on the G_SELECT. It's cheaper here to put134 ; everything on GPR.135 136 ; CHECK-LABEL: name: one_fpr_input_gpr_output137 ; CHECK: liveins: $d0, $x1, $w0138 ; CHECK-NEXT: {{ $}}139 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0140 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr(s64) = COPY $d0141 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr(s64) = COPY $x1142 ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr(s64) = COPY [[COPY1]](s64)143 ; CHECK-NEXT: [[SELECT:%[0-9]+]]:gpr(s64) = G_SELECT [[COPY]](s32), [[COPY3]], [[COPY2]]144 ; CHECK-NEXT: $x0 = COPY [[SELECT]](s64)145 ; CHECK-NEXT: RET_ReallyLR implicit $x0146 %3:_(s32) = COPY $w0147 %1:_(s64) = COPY $d0148 %2:_(s64) = COPY $x1149 %4:_(s64) = G_SELECT %3, %1, %2150 $x0 = COPY %4(s64)151 RET_ReallyLR implicit $x0152 153...154---155name: two_gpr_input_fpr_output156alignment: 4157legalized: true158tracksRegLiveness: true159machineFunctionInfo: {}160body: |161 bb.0:162 liveins: $x0, $x1, $w0163 164 ; Same as above. The G_SELECT should get all GPRS.165 166 ; CHECK-LABEL: name: two_gpr_input_fpr_output167 ; CHECK: liveins: $x0, $x1, $w0168 ; CHECK-NEXT: {{ $}}169 ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr(s32) = COPY $w0170 ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr(s64) = COPY $x0171 ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr(s64) = COPY $x1172 ; CHECK-NEXT: [[SELECT:%[0-9]+]]:gpr(s64) = G_SELECT [[COPY]](s32), [[COPY1]], [[COPY2]]173 ; CHECK-NEXT: $d0 = COPY [[SELECT]](s64)174 ; CHECK-NEXT: RET_ReallyLR implicit $d0175 %3:_(s32) = COPY $w0176 %1:_(s64) = COPY $x0177 %2:_(s64) = COPY $x1178 %4:_(s64) = G_SELECT %3, %1, %2179 $d0 = COPY %4(s64)180 RET_ReallyLR implicit $d0181